import requests
import hashlib
import base64
import json


# /**
#  * @技术QQ群: 可登录官网https://www.kdniao.com/右侧查看技术群号
#  * @see: https://kdniao.com/api-trackexpress
#  * @copyright: 深圳市快金数据技术服务有限公司
#  * ID和Key请到官网申请：https://kdniao.com/reg


#  * 快递查询接口
#  * 此接口用于向快递公司实时查询物流轨迹信息。该功能支持情况需查看技术文档。
#  * 正式地址：https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx
#  *
#  *
#  * 系统级参数
#  * RequestData	   String	R	请求内容为JSON格式 详情可参考接口技术文档：https://www.kdniao.com/documents
#  * EBusinessID	   String	R	用户ID
#  * RequestType	   String	R	请求接口指令
#  * DataSign	       String	R	数据内容签名，加密方法为：把(请求内容(未编码)+ApiKey)进行MD5加密--32位小写，然后Base64编码，最后进行URL(utf-8)编码
#  * DataType	       String	R	DataType=2，请求、返回数据类型均为JSON格式


#  * 应用级参数
#  * R-必填（Required），O-可选（Optional），C-报文中该参数在一定条件下可选（Conditional）
#  * OrderCode	        String(30)	O	订单编号
#  * CustomerName	    String(50)	C	ShipperCode为SF时必填，需要在CustomerName赋值单号对应的寄件人或收件人的手机号后四位数字
#  * ShipperCode	    String(10)	O	快递公司编码 详细编码参考《快递鸟接口支持快递公司编码.xlsx》
#  * LogisticCode	    String(30)	R	快递单号
#  *
#  *
#  * 请求示例
#  * ZTO请求示例：
#  * {
#  * "OrderCode": "",
#  * "LogisticCode": "638650888018",
#  * }
#  *
#  * JD请求示例：
#  * {
#  * "OrderCode": "",
#  * "CustomerName": "",
#  * "LogisticCode": "JDVA00003618100",
#  * }
#  *
#  * SF请求示例：
#  * {
#  * "OrderCode": "",
#  * "CustomerName": "1234",
#  * "LogisticCode": "SF00003618100",
#  * }
#  */


# 请求url --正式地址
Url = "https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx"
# 用户ID，快递鸟提供，注意保管，不要泄漏
# 即用户ID，登录快递鸟官网会员中心获取 https://www.kdniao.com/UserCenter/v4/UserHome.aspx
EBusinessID = "1237100"
# API key，快递鸟提供，注意保管，不要泄漏
# 即API key，登录快递鸟官网会员中心获取 https://www.kdniao.com/UserCenter/v4/UserHome.aspx
ApiKey = "56da2cf8-c8a2-44b2-b6fa-476cd7d1ba17"


def md5(n):
    md5 = hashlib.md5()
    md5.update(str(n).encode("utf-8"))
    return md5.hexdigest()
# md5加密


def getSign(n):
    md5Data = md5(json.dumps(n)+ApiKey)
    res = str(base64.b64encode(md5Data.encode("utf-8")), "utf-8")
    return res
# 签名


def getParams():
    # 请求接口指令
    RequestType = "8002"  # 快递查询接口指令8002/地图版快递查询接口指令8004
    # 组装应用级参数
    RequestData = {
        'OrderCode': '',
        'CustomerName': '',
        'LogisticCode': '773026589419357',
    }
    # 组装系统级参数
    data = {
        "RequestData": json.dumps(RequestData),
        "RequestType": RequestType,
        "EBusinessID": EBusinessID,
        "DataSign": getSign(RequestData),
        "DataType": 2
    }
    return data
# 请求参数


def post(url, data):
    res = requests.post(url, data)
    return res.text
# 发送post请求


def getResult():
    # 以form表单形式提交post请求，post请求体中包含了应用级参数和系统级参数
    result = post(Url, getParams())
    print(result)
# 输出结果


getResult()
